package com.nzd.slsharing.util;

import com.nzd.slsharing.exception.CustomExpiredException;
import io.jsonwebtoken.*;

import java.util.Date;

public class JwtHelper {

    private static final String SECRET_KEY = "user_token_key"; // 请使用更安全的密钥

    // 生成 JWT Token
    public static String generateToken(String studentId,String username) {
        return Jwts.builder()
                .setSubject(studentId)
                .claim("username", username)
                .setIssuedAt(new Date())  // 设置生成时间
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))  // 设置过期时间 (1小时)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // 验证 JWT Token
    public static boolean validateToken(String token) {
        try {
            // 解析并验证 JWT Token 的签名和过期时间
            Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token);  // 如果 Token 无效或过期，会抛出异常
            return true;  // Token 有效
        } catch (ExpiredJwtException e) {
            throw new CustomExpiredException("Token 已过期");
        } catch (SignatureException e) {
            throw new CustomExpiredException("Token 签名无效");
        } catch (MalformedJwtException e) {
            throw new CustomExpiredException("Token 格式不正确");
        } catch (UnsupportedJwtException e) {
            throw new CustomExpiredException("Token 不支持");
        } catch (Exception e) {
            throw new CustomExpiredException("Token 验证失败");
        }
    }

    // 从 JWT Token 中提取 studentId
    public static String getStudentIdFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();  // 获取 sub (studentId)
    }

    // 从 JWT Token 中提取 username
    public static String getUsernameFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .get("username", String.class);  // 获取 username 自定义 claim
    }
}
